#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>//引入字符处理库，用于字符大小写转换
#define MAX_WORD_LENGTH 100//定义单词的最大长度为100个字符
#define HASH_TABLE_SIZE 100000//定义哈希表的大小为100000，用于存储兄弟词团
typedef struct Node {//结构体定义
    char word[MAX_WORD_LENGTH];//存储一个单词
    struct Node* next;//指向下一个节点的指针
} Node;

typedef struct {//表示哈希表中的一个桶
    Node* head;//指向链表头节点的指针
} Bucket;
Bucket hashTable[HASH_TABLE_SIZE];//定义一个大小为 `HASH_TABLE_SIZE` 的哈希表，每个桶是一个 `Bucket` 结构体
unsigned int hashFunction(const char* str) {//计算字符串的哈希值
    unsigned int hash = 0;
    while (*str) {
        hash = (hash * 31) + tolower(*str);//将每个字符转换为小写并累加到哈希值中
        str++;
    }
    return hash % HASH_TABLE_SIZE;//返回哈希值对哈希表大小取模的结果，确保哈希值在哈希表范围内
}
void insertWord(const char* word, const char* sortedWord) {//将单词插入哈希表
    unsigned int hash = hashFunction(sortedWord);//计算排序后单词的哈希值
    Node* newNode = (Node*)malloc(sizeof(Node));//动态分配一个新节点
    strcpy(newNode->word, word);//将单词复制到新节点中
    newNode->next = hashTable[hash].head;//将新节点的 `next` 指针指向当前桶的头节点
    hashTable[hash].head = newNode;//将新节点设置为当前桶的头节点
}
void sortWord(char* word) {//对单词的字母进行排序
    int count[26] = {0};//初始化一个长度为26的数组，用于统计每个字母的出现次数
    int len = strlen(word);
    for (int i = 0; i < len; i++) {//遍历单词的每个字符，统计字母出现次数
        count[tolower(word[i]) - 'a']++;//将字符转换为小写并统计到对应位置
    }
    int index = 0;
    for (int i = 0; i < 26; i++) {//遍历字母表，按顺序重建排序后的单词
        for (int j = 0; j < count[i]; j++) {
            word[index++] = 'a' + i;//将字母按顺序写入单词
        }
    }
    word[index] = '\0';//在排序后的单词末尾添加字符串结束符
}
void printBrotherGroups() {//打印所有兄弟词团
    for (int i = 0; i < HASH_TABLE_SIZE; i++) {//遍历哈希表的每个桶
        if (hashTable[i].head != NULL) {//如果当前桶不为空，说明有兄弟词团
            Node* current = hashTable[i].head;//获取当前桶的头节点
            printf("Brother Group: ");
            while (current != NULL) {//遍历链表，打印每个单词
                printf("%s ", current->word);//打印当前节点的单词
                current = current->next;//移动到下一个节点
            }
            printf("\n");
        }
    }
}
int main() {
    FILE* file = fopen("dictionary.txt", "w");//打开词典文件
    if (!file) {//如果文件打开失败，打印错误信息并退出程序
        perror("Unable to open file");
        return 1;
    }
     fprintf(file, "abc\nbca\ncba\nbac\nhello\nworld\nhell\nleh\nlelh\n");
    fclose(file);

    // 读取词典文件并处理
    file = fopen("dictionary.txt", "r");
    if (!file) {
        perror("Unable to open file");
        return 1;
    }

    char word[MAX_WORD_LENGTH];//定义一个字符数组，用于存储从文件中读取的单词
    while (fscanf(file, "%s", word) != EOF) {//逐行读取文件中的单词
        char sortedWord[MAX_WORD_LENGTH];//定义一个字符数组，用于存储排序后的单词
        strcpy(sortedWord, word);//将原始单词复制到 `sortedWord` 中
        sortWord(sortedWord);//对单词的字母进行排序
        insertWord(word, sortedWord);//将单词插入哈希表
    }

    fclose(file);//关闭文件

    printBrotherGroups();//打印所有兄弟词团

    return 0;
}